﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajoServicioEvento');
--- crear una nueva funcion
CREATE FUNCTION "FuncOrdTrabajoServicioEvento"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codMaeServicio" CHARACTER VARYING(16)
	,INOUT	"@codMaeEventoTipo" CHARACTER VARYING(16)
	,INOUT	"@numeroEvento" INTEGER
	,INOUT	"@observaciones" CHARACTER VARYING(1024)
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	newId INTEGER;
	codOrdTrabajo character varying(16);
	codMaeServicio CHARACTER VARYING(16);
BEGIN

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codMaeServicio","codMaeEventoTipo","numeroEvento","observaciones"
		FROM	"OrdTrabajoServicioEvento"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID OT*/
	IF "@OP"='selectByIdOrdTrabajoServicio' THEN
		RETURN	QUERY
		SELECT	t1."id",t1."fechaGrab",t1."usuarioGrab",t1."activo",t1."codOrdTrabajo",t1."codMaeServicio",t1."codMaeEventoTipo",t1."numeroEvento",t1."observaciones"
		FROM	"OrdTrabajoServicioEvento" t1 INNER JOIN "OrdTrabajoServicio" t2 ON t1."codOrdTrabajo"=t2."codOrdTrabajo" AND t1."codMaeServicio"=t2."codMaeServicio"
		WHERE	t2."id"="@id";
	RETURN;
	END IF;

	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codMaeServicio","codMaeEventoTipo","numeroEvento","observaciones"
		FROM	"OrdTrabajoServicioEvento";
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- Verifico que exista el Tipo de evento
		IF NOT EXISTS (SELECT 1 FROM "MaeEventoTipo" WHERE "codMaeEventoTipo"="@codMaeEventoTipo") THEN
			Auxiliar = 'El Tipo de Evento indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- Verifico que el Tipo de evento este activo
		IF NOT EXISTS (SELECT 1 FROM "MaeEventoTipo" WHERE "codMaeEventoTipo"="@codMaeEventoTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Evento indicado NO SE ENCUENTRA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		-- obtengo los datos
		select "codOrdTrabajo" INTO codOrdTrabajo 
		from "OrdTrabajoServicio" 
		WHERE id="@id";

		select "codMaeServicio" INTO codMaeServicio 
		from "OrdTrabajoServicio" 
		WHERE id="@id";

		select MAX("numeroEvento")+1 INTO newId 
		from "OrdTrabajoServicioEvento" 
		WHERE "codMaeServicio"=codMaeServicio AND "codMaeServicio"=codMaeServicio;

		
		
		-- Grabo el registro
		INSERT INTO "OrdTrabajoServicioEvento" ("usuarioGrab","usuarioUltMod","activo","codOrdTrabajo","codMaeServicio","codMaeEventoTipo","numeroEvento","observaciones")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE),codOrdTrabajo,codMaeServicio,"@codMaeEventoTipo",coalesce(newId,1),"@observaciones");

		RETURN	QUERY
		SELECT	"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo","codMaeServicio","codMaeEventoTipo","numeroEvento","observaciones"
		FROM	"OrdTrabajoServicioEvento"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	IF "@OP"='update' THEN
		--- Verifico que no exista esa relacion
		IF EXISTS (SELECT 1 FROM "OrdTrabajoServicioEvento" WHERE "codOrdTrabajo"="@codOrdTrabajo" AND "codMaeServicio"="@codMaeServicio" AND "numeroEvento"="@numeroEvento") THEN
			Auxiliar = 'Ya existe un item con ese consecutivo, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista el Servicio
		IF NOT EXISTS (SELECT 1 FROM "MaeServicio" WHERE "codMaeServicio"="@codMaeServicio") THEN
			Auxiliar = 'El Servicio indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- Verifico que el servicio este activo
		IF NOT EXISTS (SELECT 1 FROM "MaeServicio" WHERE "codMaeServicio"="@codMaeServicio" and activo=true) THEN
			Auxiliar = 'El Servicio indicado NO SE ENCUENTRA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista el Tipo de evento
		IF NOT EXISTS (SELECT 1 FROM "MaeEventoTipo" WHERE "codEventoTipo"="@codEventoTipo") THEN
			Auxiliar = 'El Tipo de Evento indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		--- Verifico que el Tipo de evento este activo
		IF NOT EXISTS (SELECT 1 FROM "MaeEventoTipo" WHERE "codEventoTipo"="@codEventoTipo" and activo=true) THEN
			Auxiliar = 'El Tipo de Evento indicado NO SE ENCUENTRA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajoServicioEvento" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codMaeServicio"="@codMaeServicio"			
			,"codEventoTipo"="@codEventoTipo"			
			,"numeroEvento"="@numeroEvento"
			,"observaciones"="@observaciones"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;

	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "OrdTrabajoServicioEvento" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

